#include <assert.h>
#include <limits.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
 //进制转换测试用例
void reverse(char* first, char* last)
{
    for (--last; first < last; ++first, --last)
    {
        char c = *last;
        *last = *first;
        *first = c;
    }
}
 
// 缓冲区溢出的情况下返回空缓冲区
char* mitoa(int n, int base, char* buf, size_t buf_size)
{
    assert(2 <= base && base <= 16 && buf && buf_size);
    div_t dv = {.quot = n};
    char* p = buf;
    do
    {
        if (!--buf_size)
            return (*buf = '\0'), buf;
        dv = div(dv.quot, base);
        *p++ = "0123456789abcdef"[abs(dv.rem)];
    }
    while(dv.quot);
    if (n < 0)
        *p++ = '-';
    *p = '\0';
    reverse(buf, p);
    return buf;
}
 
int main(void)
{
    //buf会被分配到栈上，所以不需要手动释放，函数调用结束后会自动释放
    char buf[16];//在C语言中，delete 关键字并不存在。delete 是C++中的关键字，用于释放通过 new 分配的动态内存。在C语言中，动态内存分配和释放是通过 malloc 和 free 函数来完成的。

    printf("%s\n", mitoa(0, 2, buf, sizeof buf));
    printf("%s\n", mitoa(007, 3, buf, sizeof buf));
    printf("%s\n", mitoa(12346, 10, buf, sizeof buf));
    printf("%s\n", mitoa(-12346, 10, buf, sizeof buf));
    printf("%s\n", mitoa(-42, 2, buf, sizeof buf));
    printf("%s\n", mitoa(INT_MAX, 16, buf, sizeof buf));
    printf("%s\n", mitoa(INT_MIN, 16, buf, sizeof buf));
    printf("Buffer content: %s\n", buf); // 打印 buf 的内容
    printf("%s\n", itoa(10, buf, 4));//效果一样
    printf("Buffer content: %s\n", buf); // 打印 buf 的内容
    
}